package com.itheima.reggie.controlle;

import com.itheima.reggie.common.R;
import com.itheima.reggie.common.SRException;
import com.itheima.reggie.pojo.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.SMSUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 移动端用户管理
 */
@RestController
@RequestMapping("user")
@Slf4j
public class UserController {

    @Autowired
    UserService userService;
    @Autowired
    RedisTemplate<Object,Object> redisTemplate;

    /**
     * 获取验证码
     */
    @PostMapping("sendMsg")
    private R<String> sendMsg(@RequestBody User user,
                              HttpSession session) {
        //随机数
        String code = RandomStringUtils.random(4, false, true);
        log.info("验证码: {}", code);
        String phone = user.getPhone();
        //获取验证码
        SMSUtils.sendMessage(user.getPhone(), code);
        //存入session
        //session.setAttribute("code",code);
        redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
        return R.error("success");
    }

    /**
     * 登录逻辑
     * 参数: 两个参数  使用map集合
     */
    @PostMapping("/login")
    private R<User> login(@RequestBody Map<String,String> map,
                    HttpSession session){
        //查验证码 系统提交的是否和用户输入的一致 如果不一致则抛出异常
        //获取验证码
        String phone = map.get("phone");
        String code1 = map.get("code");
        //从session中获取验证码
        //String code2 = (String) session.getAttribute("code");
        //从redis中获取验证码
        String code2 = (String) redisTemplate.opsForValue().get(phone);
        //判断验证码是否一致
        if(!StringUtils.equals(code1,code2)){
            //不一致抛出异常
            //删除验证码
            redisTemplate.delete(phone);
            throw new SRException("验证码错误!");
        }

        //判断手机号是否注册 从数据库查如果数据库没有则没注册 ,自动帮他注册手机号到数据库
        //获取前端传来的手机号
        //获取user对象并判断手机号是否存在
        User userPhone = userService.lambdaQuery()
                .eq(StringUtils.isNotBlank(phone), User::getPhone, phone).one();

        //判断手机号在数据库是否为空
        if(userPhone == null){
            //如果没有则创建
            //创建新对象
            userPhone = new User();
            userPhone.setPhone(phone);

            userService.save(userPhone);
        }

        //到这就数据库就有数据了
        //把此登录进去的用户id存入session 方便以后操作
        session.setAttribute("userId",userPhone.getId());
        //登录成功删除验证码
        redisTemplate.delete(phone);
        //返回对象
        return R.success(userPhone);
    }

}
